/******************************************************************************************************************
 * 					Filename: xeLOG_internal.h
 ******************************************************************************************************************
 * Description:
 * 		 equipment log interface.
 * Version:
 *	 	 V_0.7 Jan-30-2011
 * Copyright:
 * 		 HISOME <http://www.hisome.com>
 * Author:
 * 		 renhw <renhw@hisome.com.>
******************************************************************************************************************/
#ifndef __XELOG_INTERNAL_H_
#define __XELOG_INTERNAL_H_

#ifdef CONFIG_USE_EXTERNAL_XELOG
#include <xelog.h>
#else/*!CONFIG_USE_EXTERNAL_XELOG*/

#include <stdio.h>
#include <syslog.h>
#include <errno.h>
#include <string.h>
#include <stdarg.h>

#ifdef __cplusplus
extern "C"
{
#endif
/**
 * log level,0~7,large number,large messages
 * 		0 - xeLOG_EMERG(fmt, args...)
 *		1 - xeLOG_CRIT(fmt, args...)
 *		2 - xeLOG_ALERT(fmt, args...)
 *		3 - xeLOG_ERR(fmt, args...)
 *		4 - xeLOG_WARNING(fmt, args...)
 *		5 - xeLOG_NOTICE(fmt, args...)
 *		6 - xeLOG_INFO(fmt, args...)
 *		7 - xeLOG_DEBUG(fmt, args...)
 **/
#ifndef LOG_EMERG
#define LOG_EMERG 0
#endif//LOG_EMERG
	
#ifndef LOG_CRIT
#define LOG_CRIT 1
#endif//LOG_CRIT
	
#ifndef LOG_ALERT
#define LOG_ALERT 2
#endif//LOG_ALERT
	
#ifndef LOG_ERR
#define LOG_ERR 3
#endif//LOG_ERR
	
#ifndef LOG_WARNING
#define LOG_WARNING 4
#endif//LOG_WARNING
	
#ifndef LOG_NOTICE
#define LOG_NOTICE 5
#endif//LOG_NOTICE
	
#ifndef LOG_INFO
#define LOG_INFO 6
#endif//LOG_INFO
	
#ifndef LOG_DEBUG
#define LOG_DEBUG 7
#endif//LOG_DEBUG

#define LOG_PREFIX "TinyBear"

#ifndef STD_print
#define STD_print(fmt, arg...) printf(LOG_PREFIX"[%s, %d]"fmt"\n",  __FILE__, __LINE__, ##arg);
#endif




extern int _log_level;



#define BLACK     "\033[0;30m"
#define RED       "\033[0;31m"
#define LIGNT_RED "\033[1;31m"
#define GREEN     "\033[0;32m"
#define YELLOW    "\033[0;33m"
#define BLUE 	  "\033[0;34m"
#define MAGENTA   "\033[0;35m"
#define CYAN   	  "\033[0;36m"
#define WHITE 	  "\033[0;38m"
#define END		  "\033[0m"

#define COLOR_DEBUG		WHITE
#define COLOR_INFO		CYAN
#define COLOR_NOTICE	BLUE
#define COLOR_WARNING	GREEN
#define COLOR_ERR		RED
#define COLOR_ALERT		YELLOW
#define COLOR_CRIT		MAGENTA
#define COLOR_EMERG		LIGNT_RED
#define COLOR_END		END

#define xeLOG_EMERG(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_EMERG)) { \
				fprintf(stderr, COLOR_EMERG LOG_PREFIX"(%s.%d.EMERG): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stderr); \
			} \
		}while(0);

#define xeLOG_CRIT(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_CRIT)) { \
				fprintf(stderr, COLOR_CRIT LOG_PREFIX"(%s.%d.CRIT): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stderr); \
			} \
		}while(0);

#define xeLOG_ALERT(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_ALERT)) { \
				fprintf(stderr, COLOR_ALERT LOG_PREFIX"(%s.%d.ALERT): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stderr); \
			} \
		}while(0);

#define xeLOG_ERR(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_ERR)) { \
				fprintf(stderr, COLOR_ERR LOG_PREFIX"(%s.%s.%d.ERR): "fmt"\n"COLOR_END,__FILE__,__FUNCTION__,__LINE__, ##args); \
				fflush(stderr); \
			} \
		}while(0);

#define xeLOG_WARNING(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_WARNING)) { \
				fprintf(stderr, COLOR_WARNING LOG_PREFIX"(%s.%d.WARNING): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stderr); \
			} \
		}while(0);

#define xeLOG_NOTICE(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_NOTICE)) { \
				fprintf(stderr, COLOR_NOTICE LOG_PREFIX"(%s.%d.NOTICE): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stderr); \
			} \
		}while(0);

#define xeLOG_INFO(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_INFO)) { \
				fprintf(stdout, COLOR_INFO LOG_PREFIX"(%s.%d.INFO): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stdout); \
			} \
		}while(0);

#define xeLOG_DEBUG(fmt, args...) \
		do{ \
			if(_log_level>=(LOG_DEBUG)) { \
				fprintf(stdout, COLOR_DEBUG LOG_PREFIX"(%s.%d.DBG): "fmt"\n"COLOR_END,__FILE__,__LINE__, ##args); \
				fflush(stdout); \
			} \
		}while(0);
#endif/*!CONFIG_USE_EXTERNAL_XELOG*/

#define eprintf(fmt, args...) \
		do{ \
			xeLOG_ERR(fmt, ##args);\
		}while(0);

#define dprintf(fmt, args...) \
		do{ \
			xeLOG_DEBUG(fmt, ##args);\
		}while(0);

#ifdef NDEBUG
#define DBG(fmt, args...)
#else
#define DBG(fmt, args...)\
		do{	\
			xeLOG_DEBUG(fmt, ##args);\
		}while(0);
#endif

#ifndef BUG
#define BUG() \
		do{	\
			xeLOG_ALERT("BUG: PC@here");\
		}while(0);
#endif/*BUG*/

#ifndef BUGMSG
#define BUGMSG(fmt,args...) \
		do{	\
			xeLOG_ALERT("BUG: "fmt,##args);\
		}while(0);
#endif/*BUGMSG*/

#ifdef __cplusplus
}
#endif

#endif /* __XELOG_INTERNAL_H_ */
